---
id: designPrinciples
title: 软件设计原则与分层  
---

## 软件设计原则
### 单一职责原则

1. 永远不应该有多于—个原因来改变某个类。
2. 理解：对于一个类而言，应该仅有一个引起亡变化的原因。
3. 应用：如果一个类拥有了两种职责 ，那就可以将这个类分成两个类。

### 开放封闭原则

1. 软件实体扩展应该是开放的，但对于修改应该是封闭的。  
2. 理解：对扩展开放，对修改封闭。可以去扩展类，但不要去修改类。  
3. 应用：当需求有改动 ，尽量用继承或组合的方式来扩展类的功能，而
不是直接修改类的代码。  

### 里氏替换原则  

1. 理解：父类一定能够被子类替换  

### 最少知识原则  

1. 只与你最直接的对象交流。  
2. 理解：低耦合，高内聚。  
3. 应用：做系统设计时，尽量减小依赖关系。

### 接口隔离原则

1. 一个类与另一个类之间的依赖性，应该依赖于尽可能小的接口。  
2. 理解：不要对外暴露没有实际意义的接口。用户不应该依赖它不需要的接口。  
3. 应用：当需要对外暴露接口时，如果是非必要对外提供，尽量删除。

### 依赖倒置原则

1. 高层模块不应该依赖于低层模块，它们应该依赖于抽象。抽象不应该依赖于细节，细节应该依赖于抽象。
2. 理解：应该面向接口编程，不应该面向实现类编程。  
3. 并不是说，所有的类都要有一个对应的接口，而是说，如果有接口那就尽量使用接口来编程吧。

### 总结
将以上六大原则的英文首宇母拼在一起就是SOLID（稳定的），所以也称之为 SOLID 原则。

### 组合/聚合复用原则

1. 当要扩展类的功能时，优先考虑使用组合，而不是继承。  
2. 该原则在 23种经典设计模式中频繁使用。  
3. 如：代理模式、装饰模式、适配器模式等。  

### 无环依赖原则

1. 当A模块依赖于 B 模块，B模块依赖于 C模块，C依赖于 A模块此时将出现循环依赖®
2. 在设计中避免该问题，可通过引入“中介者模式”解決。

### 共同封装原则

1. 应该将易变的类放在同一个包里 ，将变化隔离出来。  
2. 该原则是“开放-封闭原则” 的延生

### 共同重用原则

1. 如果重用了包中的一个类，那么也就相当于重用了包中的所有类，我们要尽可能减小包的大小。

### 好菜坞原则

1. Don't call me, I'll call you.   
2. “控制反转〞（或称为“依赖注入〞）  
3. 不需要主动创建对象，而是由容器帮我们来创建并管理这些对象。

### 其他设计原则

1. 不要让重复的代码到处都是，要让它们足够的重用，所以要尽可能地封装。
2. 保持它简单与傻瓜。持系统界面简洁，功能实用，操作方便。
3. 关注点分离。将一个复杂的问题分萬为多个简单的问题，然后逐个解决。难点：如何进行分离。
4. 你不需要它。不要一开始就把系统设计得非常复杂，不要陷入 “过度设计〞的深渊。让系统足够简单，而又不失扩展性。


## 软件设计分层